package com.manong.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.manong.dao.UserMapper;
import com.manong.entity.User;
import com.manong.service.UserService;
import com.manong.vo.query.UserQueryVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import java.util.List;

/**
 * @author 李茂鑫
 * @Date 2025/1/8 11:08
 * @Descripition  用户服务实现类
 */
@Service
@Transactional //注解用于声明事务管理，表示该方法或类中的所有方法都应在一个事务上下文中执行。确保方法执行时的数据一致性和可靠性，在发生异常时自动回滚事务。
//UserServiceImpl继承ServiceImpl类，它通过泛型参数 UserMapper 和 User 来进行配置。UserMapper是Mapper接口，继承了MyBatis-Plus的BaseMapper。定义了User表。
// 实现传入自己的 Mapper 和实体类，就能直接使用这些常用的数据库操作，而不需要手动编写 SQL 语句。并且实现接口UserService
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService{
    @Override
    public User findUserByUserName(String username) {
        QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
        // QueryWrapper是 MyBatis-Plus 中用于封装查询条件的一个非常强大的工具，可以帮助我们使用链式编程的方式轻松构建各种查询条件。
        //使用queryWrapper创建条件查询构造器对象
        queryWrapper.eq("username",username);
        //设置sql语句查询
        return baseMapper.selectOne(queryWrapper);
        //selectOne(queryWrapper)方法会根据queryWrapper中的条件执行查询，返回符合条件的第一条记录。
        // selectOne会返回一个User对象，如果没有匹配的用户，会返回null。
    }

    /**
     * 分页查询用户列表
     * @param page
     * @param userQueryVo
     * @return
     */
    @Override
    public IPage<User> findUserListByPage(IPage<User> page, UserQueryVo userQueryVo) {
        //创建条件构造器对象
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
        //部门编号
        queryWrapper.eq(!ObjectUtils.isEmpty(userQueryVo.getDepartmentId()), "department_id", userQueryVo.getDepartmentId());
        //用户名
        queryWrapper.like(!ObjectUtils.isEmpty(userQueryVo.getUsername()), "username", userQueryVo.getUsername());
        //真实姓名
        queryWrapper.like(!ObjectUtils.isEmpty(userQueryVo.getRealName()), "real_name", userQueryVo.getRealName());
        //电话
        queryWrapper.like(!ObjectUtils.isEmpty(userQueryVo.getPhone()), "phone", userQueryVo.getPhone());
        //        查询并返回数据
        return baseMapper.selectPage(page, queryWrapper);
    }
    /**
     * 删除用户
     * @param id
     * @return
     */

    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public boolean deleteById(Long id) {
        //查询
        User user=baseMapper.selectById(id);
        //删除用户角色关系
        baseMapper.deleteUserRole(id);
        //删除用户
        return baseMapper.deleteById(id) > 0;
    }


    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public boolean saveUserRole(Long userId, List<Long> roleIds) {
        //删除该用户对应的角色信息
        baseMapper.deleteUserRole(userId);
        return baseMapper.saveUserRole(userId, roleIds)>0;
    }

}